function _typeof(obj) {
  '@babel/helpers - typeof';
  return (
    (_typeof =
      'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator
        ? function (obj) {
            return typeof obj;
          }
        : function (obj) {
            return obj &&
              'function' == typeof Symbol &&
              obj.constructor === Symbol &&
              obj !== Symbol.prototype
              ? 'symbol'
              : typeof obj;
          }),
    _typeof(obj)
  );
}
var _excluded = ['children'],
  _excluded2 = ['dataSource', 'targetKeys', 'treeProps'];
function _extends() {
  _extends = Object.assign
    ? Object.assign.bind()
    : function (target) {
        for (var i = 1; i < arguments.length; i++) {
          var source = arguments[i];
          for (var key in source) {
            if (Object.prototype.hasOwnProperty.call(source, key)) {
              target[key] = source[key];
            }
          }
        }
        return target;
      };
  return _extends.apply(this, arguments);
}
function _toConsumableArray(arr) {
  return (
    _arrayWithoutHoles(arr) ||
    _iterableToArray(arr) ||
    _unsupportedIterableToArray(arr) ||
    _nonIterableSpread()
  );
}
function _nonIterableSpread() {
  throw new TypeError(
    'Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.',
  );
}
function _unsupportedIterableToArray(o, minLen) {
  if (!o) return;
  if (typeof o === 'string') return _arrayLikeToArray(o, minLen);
  var n = Object.prototype.toString.call(o).slice(8, -1);
  if (n === 'Object' && o.constructor) n = o.constructor.name;
  if (n === 'Map' || n === 'Set') return Array.from(o);
  if (n === 'Arguments' || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))
    return _arrayLikeToArray(o, minLen);
}
function _iterableToArray(iter) {
  if (
    (typeof Symbol !== 'undefined' && iter[Symbol.iterator] != null) ||
    iter['@@iterator'] != null
  )
    return Array.from(iter);
}
function _arrayWithoutHoles(arr) {
  if (Array.isArray(arr)) return _arrayLikeToArray(arr);
}
function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length) len = arr.length;
  for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
  return arr2;
}
function ownKeys(object, enumerableOnly) {
  var keys = Object.keys(object);
  if (Object.getOwnPropertySymbols) {
    var symbols = Object.getOwnPropertySymbols(object);
    enumerableOnly &&
      (symbols = symbols.filter(function (sym) {
        return Object.getOwnPropertyDescriptor(object, sym).enumerable;
      })),
      keys.push.apply(keys, symbols);
  }
  return keys;
}
function _objectSpread(target) {
  for (var i = 1; i < arguments.length; i++) {
    var source = null != arguments[i] ? arguments[i] : {};
    i % 2
      ? ownKeys(Object(source), !0).forEach(function (key) {
          _defineProperty(target, key, source[key]);
        })
      : Object.getOwnPropertyDescriptors
      ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source))
      : ownKeys(Object(source)).forEach(function (key) {
          Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
        });
  }
  return target;
}
function _defineProperty(obj, key, value) {
  key = _toPropertyKey(key);
  if (key in obj) {
    Object.defineProperty(obj, key, {
      value: value,
      enumerable: true,
      configurable: true,
      writable: true,
    });
  } else {
    obj[key] = value;
  }
  return obj;
}
function _toPropertyKey(arg) {
  var key = _toPrimitive(arg, 'string');
  return _typeof(key) === 'symbol' ? key : String(key);
}
function _toPrimitive(input, hint) {
  if (_typeof(input) !== 'object' || input === null) return input;
  var prim = input[Symbol.toPrimitive];
  if (prim !== undefined) {
    var res = prim.call(input, hint || 'default');
    if (_typeof(res) !== 'object') return res;
    throw new TypeError('@@toPrimitive must return a primitive value.');
  }
  return (hint === 'string' ? String : Number)(input);
}
function _objectWithoutProperties(source, excluded) {
  if (source == null) return {};
  var target = _objectWithoutPropertiesLoose(source, excluded);
  var key, i;
  if (Object.getOwnPropertySymbols) {
    var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
    for (i = 0; i < sourceSymbolKeys.length; i++) {
      key = sourceSymbolKeys[i];
      if (excluded.indexOf(key) >= 0) continue;
      if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
      target[key] = source[key];
    }
  }
  return target;
}
function _objectWithoutPropertiesLoose(source, excluded) {
  if (source == null) return {};
  var target = {};
  var sourceKeys = Object.keys(source);
  var key, i;
  for (i = 0; i < sourceKeys.length; i++) {
    key = sourceKeys[i];
    if (excluded.indexOf(key) >= 0) continue;
    target[key] = source[key];
  }
  return target;
}
import { Transfer as AntdTransfer, Tree } from 'antd';
import 'antd/es/transfer/style/index.js';
import React, { useMemo } from 'react';
import createField from '../../createField';
var generateTree = function generateTree() {
  var treeNodes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
  var checkedKeys = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
  var direction = arguments.length > 2 ? arguments[2] : undefined;
  return treeNodes.map(function (_ref) {
    var children = _ref.children,
      props = _objectWithoutProperties(_ref, _excluded);
    return _objectSpread(
      _objectSpread({}, props),
      {},
      {
        disabled:
          direction === 'left' ? checkedKeys.includes(props.key) : !checkedKeys.includes(props.key),
        children: generateTree(children, checkedKeys, direction),
      },
    );
  });
};
var TreeTransfer = function TreeTransfer(_ref2) {
  var dataSource = _ref2.dataSource,
    _ref2$targetKeys = _ref2.targetKeys,
    targetKeys = _ref2$targetKeys === void 0 ? [] : _ref2$targetKeys,
    _ref2$treeProps = _ref2.treeProps,
    treeProps = _ref2$treeProps === void 0 ? {} : _ref2$treeProps,
    rest = _objectWithoutProperties(_ref2, _excluded2);
  var transferDataSource = useMemo(
    function () {
      var result = [];
      function flatten() {
        var list = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
        list.forEach(function (item) {
          result.push(item);
          if (item.children) flatten(item.children);
        });
      }
      flatten(dataSource);
      return result;
    },
    [dataSource],
  );
  return /*#__PURE__*/ React.createElement(
    AntdTransfer,
    _extends({}, rest, {
      targetKeys: targetKeys,
      dataSource: transferDataSource,
    }),
    function (_ref3) {
      var direction = _ref3.direction,
        onItemSelect = _ref3.onItemSelect,
        selectedKeys = _ref3.selectedKeys;
      var checkedKeys = [].concat(_toConsumableArray(selectedKeys), _toConsumableArray(targetKeys));
      // console.log('checkedKeys', generateTree(dataSource, targetKeys, direction))
      return /*#__PURE__*/ React.createElement(
        Tree,
        _extends(
          {
            blockNode: true,
            checkable: true,
            checkStrictly: true,
            defaultExpandAll: true,
          },
          treeProps,
          {
            checkedKeys: selectedKeys,
            treeData: generateTree(dataSource, targetKeys, direction),
            onCheck: function onCheck(_, _ref4) {
              var key = _ref4.node.key;
              if (direction === 'left') {
                onItemSelect(key, !checkedKeys.includes(key));
              } else {
                onItemSelect(key, checkedKeys.includes(key));
              }
            },
            onSelect: function onSelect(_, _ref5) {
              var key = _ref5.node.key;
              if (direction === 'left') {
                onItemSelect(key, !checkedKeys.includes(key));
              } else {
                onItemSelect(key, checkedKeys.includes(key));
              }
            },
          },
        ),
      );
    },
  );
};
export default createField(TreeTransfer, {
  defaultFormItemProps: {
    valuePropName: 'targetKeys',
  },
});
